#include <QtGui>

#include "diagramscene.h"
#include "arrow.h"

DiagramScene::DiagramScene(QMenu *itemMenu, QObject *parent)
    : QGraphicsScene(parent)
{
    myItemMenu = itemMenu;
    myMode = MoveItem;
    myItemType = DiagramItem::Step;
    line = 0;
    textItem = 0;
    myItemColor = Qt::white;
    myTextColor = Qt::black;
    myLineColor = Qt::black;
}


void DiagramScene::setMode(Mode mode) {
    myMode = mode;
}

void DiagramScene::setItemType(DiagramItem::DiagramType type) {
    myItemType = type;
}


void DiagramScene::editorLostFocus(DiagramTextItem *item) {
    QTextCursor cursor = item->textCursor();
    cursor.clearSelection();
    item->setTextCursor(cursor);

    if (item->toPlainText().isEmpty()) {
        removeItem(item);
        item->deleteLater();
    }
}
QPointF DiagramScene::posMouse() {
	return posMous;
}
QGraphicsTextItem* DiagramScene::getTextItem() {
	return tItem;
}
QGraphicsItem* DiagramScene::getItem() {
	return objItem;
}
int DiagramScene::getMode() {
	return objmyMode;
}
int DiagramScene::getItemType() {
	return myItemType;
}
void DiagramScene::addObjDiagram(QPointF XY, Mode mod,DiagramItem::DiagramType type) {
	DiagramItem *item;
    switch (mod) {
        case InsertItem:
            item = new DiagramItem(type, myItemMenu);
            item->setBrush(myItemColor);
            addItem(item);
            item->setPos(XY);
            emit itemInserted(item);
            break;

        case InsertLine:
            line = new QGraphicsLineItem(QLineF(XY,XY));
            line->setPen(QPen(myLineColor, 2));
            addItem(line);
            break;

		case InsertText: {
				textItem = new DiagramTextItem();
				textItem->setFont(myFont);
			   /* textItem->setTextInteractionFlags(Qt::TextEditorInteraction);
				textItem->setZValue(1000.0);
				connect(textItem, SIGNAL(lostFocus(DiagramTextItem*)),this, SLOT(editorLostFocus(DiagramTextItem*)));
				connect(textItem, SIGNAL(selectedChange(QGraphicsItem*)), this, SIGNAL(itemSelected(QGraphicsItem*)));
				addItem(textItem);
				textItem->setDefaultTextColor(myTextColor);
				textItem->setPos(mouseEvent->scenePos());
				emit textInserted(textItem);*/
			}
    default:
        ;
	}
}
void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
    if (mouseEvent->button() != Qt::LeftButton)
        return;
	
	objmyMode = myMode;
	posMous = mouseEvent->scenePos();
    DiagramItem *item;
    switch (myMode) {
        case InsertItem:
            item = new DiagramItem(myItemType, myItemMenu);
            item->setBrush(myItemColor);
			objItem = item;
            addItem(item);
            item->setPos(mouseEvent->scenePos());
            emit itemInserted(item);
            break;

        case InsertLine:
            line = new QGraphicsLineItem(QLineF(mouseEvent->scenePos(), mouseEvent->scenePos()));
            line->setPen(QPen(myLineColor, 2));
            addItem(line);
            break;

		case InsertText: {
			/*QList<QGraphicsItem *> clMouse = items(mouseEvent->scenePos());
			//if (clMouse.count())  
			//	clMouse.removeFirst();
			if(clMouse.count() > 0) {// && clMouse.first()->type() == DiagramItem::Type) {
				DiagramTextItem *clMouseItem = qgraphicsitem_cast<DiagramTextItem *>(clMouse.first());

				clMouseItem->setFont(myFont);
				clMouseItem->setTextInteractionFlags(Qt::TextEditorInteraction);
				clMouseItem->setZValue(1000.0);
				connect(clMouseItem, SIGNAL(lostFocus(DiagramTextItem*)),this, SLOT(editorLostFocus(DiagramTextItem*)));
				connect(clMouseItem, SIGNAL(selectedChange(QGraphicsItem*)), this, SIGNAL(itemSelected(QGraphicsItem*)));
				addItem(clMouseItem);
				clMouseItem->setDefaultTextColor(myTextColor);
				clMouseItem->setPos(mouseEvent->scenePos());
				emit textInserted(textItem);
				
			}
						 }*/
            textItem = new DiagramTextItem();
            textItem->setFont(myFont);
            textItem->setTextInteractionFlags(Qt::TextEditorInteraction);
            textItem->setZValue(1000.0);
            connect(textItem, SIGNAL(lostFocus(DiagramTextItem*)),this, SLOT(editorLostFocus(DiagramTextItem*)));
            connect(textItem, SIGNAL(selectedChange(QGraphicsItem*)), this, SIGNAL(itemSelected(QGraphicsItem*)));
            addItem(textItem);
            textItem->setDefaultTextColor(myTextColor);
            textItem->setPos(mouseEvent->scenePos());
			emit textInserted(textItem);
			}
    default:
        ;
    }
    QGraphicsScene::mousePressEvent(mouseEvent);
}
void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
	if (mouseEvent->button() != Qt::LeftButton)
        return;
    if (myMode == InsertLine && line != 0) {
        QLineF newLine(line->line().p1(), mouseEvent->scenePos());
        line->setLine(newLine);
    } else if (myMode == MoveItem) {
		QPointF tt = mouseEvent->scenePos();
        QGraphicsScene::mouseMoveEvent(mouseEvent);
    }
}
void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
    if (line != 0 && myMode == InsertLine) {
        QList<QGraphicsItem *> startItems = items(line->line().p1());
        if (startItems.count() && startItems.first() == line)
            startItems.removeFirst();
        QList<QGraphicsItem *> endItems = items(line->line().p2());
        if (endItems.count() && endItems.first() == line)
            endItems.removeFirst();

        removeItem(line);
        delete line;

        if (startItems.count() > 0 && endItems.count() > 0 &&
            startItems.first()->type() == DiagramItem::Type &&
            endItems.first()->type() == DiagramItem::Type &&
            startItems.first() != endItems.first()) {
            DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(startItems.first());
            DiagramItem *endItem = qgraphicsitem_cast<DiagramItem *>(endItems.first());
            Arrow *arrow = new Arrow(startItem, endItem);
            arrow->setColor(myLineColor);
            startItem->addArrow(arrow);
            endItem->addArrow(arrow);
            arrow->setZValue(-1000.0);
            addItem(arrow);
            arrow->updatePosition();
        }
    }
    line = 0;
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}